home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / nessus-mkcert-client < prev    next >
Text File  |  2006-03-29  |  13KB  |  471 lines

  1. #!/bin/sh
  2. #
  3. # nessus-mkcert-client
  4. #
  5. # Written by Michel Arboi <arboi@alussinan.org> from nessus-mkcert
  6. #
  7. # This script is distributed under the Gnu General Public License (GPL)
  8. #
  9.  
  10. case `echo -n` in
  11. \-n)    Xn=   ; Xc='\c' ;;
  12. *)    Xn=-n ; Xc=
  13. esac
  14.  
  15. umask 022
  16.  
  17. prefix=/usr
  18. datadir=/usr/share
  19. sysconfdir=/etc
  20. localstatedir=/var/lib
  21. sharedstatedir=${prefix}/com
  22. sbindir=${prefix}/sbin
  23. bindir=${prefix}/bin
  24. egdpath=@egdpath@
  25. is_cygwin=@is_cygwin@
  26.  
  27. RANDFLAG=""
  28. test -n "$egdpath" && 
  29. {
  30.  RANDFLAG="-rand $egdpath"
  31. }
  32.  
  33. PATH=$PATH:$sbindir:$bindir:/usr/ssl/bin:/usr/local/ssl/bin:/opt/ssl/bin
  34.  
  35. # check if gettext is present
  36.  
  37. if [ -f /usr/bin/gettext.sh ];
  38. then
  39.  
  40.   # initialize gettext
  41.  
  42.   . gettext.sh
  43.   export TEXTDOMAIN=nessus-scripts
  44.   export TEXTDOMAINDIR=/usr/share/locale
  45.  
  46. else
  47.  
  48.   # define dummy functions
  49.  
  50.   gettext () {
  51.     echo $Xn "$1" $Xc
  52.   }
  53.  
  54.   eval_gettext () {
  55.     eval_gettext_var="echo $1"
  56.     echo $Xn `eval $eval_gettext_var` $Xc
  57.   }
  58.  
  59. fi
  60.  
  61. Bo='('
  62. Bc=')'
  63. Hash='#'
  64.  
  65. echo_no_nl ()
  66. {
  67.     echo $Xn "$*$Xc"
  68. }
  69.  
  70.  
  71. header()
  72. {
  73. clear
  74. echo "-------------------------------------------------------------------------------"
  75. gettext "            Creation Nessus SSL Client Certificate"; echo
  76. echo "-------------------------------------------------------------------------------"
  77. echo
  78. }
  79. #
  80.  
  81. #
  82. # We need openssl
  83. #
  84. case `openssl version` in 
  85.  OpenSSL*)
  86.      ;;
  87.  *)
  88.    gettext "OpenSSL is not properly installed: The 'openssl' command line utility could not be found (is your \$PATH set properly?)"; echo
  89.    exit 1
  90. esac
  91.      
  92. # Check environment
  93. if [ -z "$HOME" ]; then
  94.     gettext "\$HOME should be defined." 1>&2; echo; exit 1
  95. fi
  96.  
  97. #
  98. # If EGD is not installed, we have to rely on other sources
  99. # of entropy
  100. test -z "$RANDFLAG" -a -z "$RANDFILE" &&
  101. {
  102.  if [ ! -r /dev/random -a ! -r /dev/urandom -a ! -r $HOME/.rnd ];
  103.   then
  104.    header
  105.    gettext "You do not have any suitable random source."; echo
  106.    gettext "You will be asked to type a few random keys on your keyboard to generate random bytes."; echo
  107.    nessus-mkrand $HOME/.rnd 1024 
  108.    gettext "Press [ENTER] to continue..."; echo
  109.   fi
  110. }
  111.  
  112.  
  113.  
  114. NESSUSPRIV="$localstatedir/nessus/CA"
  115. NESSUSPUB="$sharedstatedir/nessus/CA"
  116.  
  117. while [ ! -d "$NESSUSPRIV" ]; do
  118.     gettext "Nessus server 'private' directory: "
  119.     read NESSUSPRIV
  120. done
  121.  
  122. while [ ! -d "$NESSUSPUB" ]; do
  123.     gettext "Nessus server 'public' directory: "
  124.     read NESSUSPUB
  125. done
  126.  
  127. CAKEY=$NESSUSPRIV/cakey.pem
  128. CACERT=$NESSUSPUB/cacert.pem
  129.  
  130. while [ ! -f "$CAKEY" ]; do
  131.     eval_gettext "\$CAKEY: not found or not a file."
  132.     gettext "Nessus CA private key: "
  133.     read CAKEY
  134. done
  135.  
  136. while [ ! -f "$CACERT" ]; do
  137.     eval_gettext "\$CACERT: not found or not a file."
  138.     gettext "Nessus CA certificate: "
  139.     read CACERT
  140. done
  141.  
  142. for F in "$CAKEY" "$CACERT"; do 
  143.     if [ ! -r "$F" ]; then
  144.     eval_gettext "Cannot read \$F" 1>&2; echo; exit 1
  145.     fi
  146. done
  147.  
  148. R=x
  149. while [ "$R" != `gettext "y"` -a "$R" != `gettext "n"` ]; do
  150.     gettext "Do you want to register the users in the Nessus server as soon as you create their certificates? (y/n): "
  151.     read R
  152. done
  153.  
  154. if [ "$R" = `gettext "y"` ]; then
  155.     USERSDIR=$localstatedir/nessus/users
  156.     while [ ! -d "$USERSDIR" ]; do
  157.     eval_gettext "\$USERSDIR: not a directory."; echo
  158.     gettext "Users directory? "
  159.     read USERSDIR
  160.     done
  161. else
  162.     USERSDIR=""
  163. fi
  164.  
  165. umask 066
  166.  
  167. # Set environment
  168. BASEDIR=${TMPDIR-/tmp}/nessus-mkcert.$$
  169. mkdir $BASEDIR || exit 1
  170.  
  171.  
  172. gettext "This script will now ask you the relevant information to create the SSL client certificates for Nessus."; echo
  173.  
  174. gettext "Client certificates life time in days [365]: "; read x
  175. DFL_CERT_LIFETIME=${x:-365}
  176.  
  177. # Default country = France - Too bad for you, but quicker for my tests!
  178. if [ ! -z "$LANG" ]; then
  179.     DC=`echo $LANG | sed -n 's/^..*_\(..\)$/\1/p'`
  180. fi
  181. X=${DC:=FR}
  182. eval_gettext "Your country \${Bo}two letter code\${Bc} [\$X]: "; read x
  183. DFL_COUNTRY=${x:-$DC}
  184. gettext "Your state or province name [none]: "; read DFL_PROVINCE
  185. X=Paris; 
  186. eval_gettext "Your location \${Bo}e.g. town\${Bc} [\$X]: "; read x
  187. DFL_LOCATION=${x:-$X}
  188. gettext "Your organization [none]: "; read DFL_ORGANIZATION
  189. gettext "Your organizational unit [none]: "; read DFL_ORGUNIT
  190.  
  191. #
  192.  
  193. cat <<EOF>$BASEDIR/stdC.cnf
  194. RANDFILE        = $HOME/.rnd
  195. #
  196. [ ca ]
  197. default_ca = NessusCA
  198.  
  199. [ NessusCA ]
  200. dir        = $BASEDIR        # Where everything is kept
  201. certs        = \$dir            # Where the issued certs are kept
  202. crl_dir        = \$dir            # Where the issued crl are kept
  203. database    = \$dir/index.txt    # database index file.
  204. new_certs_dir    = \$dir            # default place for new certs.
  205.  
  206. certificate    = $CACERT         # The CA certificate
  207. serial        = \$dir/serial         # The current serial number
  208. crl        = \$dir/crl.pem     # The current CRL
  209. private_key    = $CAKEY        # The private key
  210.  
  211. x509_extensions    = usr_cert        # The extentions to add to the cert
  212. crl_extensions    = crl_ext
  213.  
  214. default_days    = 365        # how long to certify for
  215. default_crl_days= 30            # how long before next CRL
  216. default_md    = md5            # which md to use.
  217. preserve    = no            # keep passed DN ordering
  218.  
  219. policy        = policy_anything
  220.  
  221. [ policy_anything ]
  222. countryName             = optional
  223. stateOrProvinceName     = optional
  224. localityName            = optional
  225. organizationName        = optional
  226. organizationalUnitName  = optional
  227. commonName              = supplied
  228. emailAddress            = optional
  229.  
  230. [ req ]
  231. default_bits        = 1024
  232. distinguished_name    = req_distinguished_name
  233. # attributes        = req_attributes
  234. x509_extensions    = v3_ca    # The extentions to add to the self signed cert
  235.  
  236. [ req_distinguished_name ]
  237. countryName            = Country Name (2 letter code)
  238. countryName_default        = FR
  239. countryName_min            = 2
  240. countryName_max            = 2
  241.  
  242. stateOrProvinceName        = State or Province Name (full name)
  243. stateOrProvinceName_default    = Some-State
  244.  
  245. localityName            = Locality Name (eg, city)
  246.  
  247. 0.organizationName        = Organization Name (eg, company)
  248. 0.organizationName_default    = Internet Widgits Pty Ltd
  249.  
  250. # we can do this but it is not needed normally :-)
  251. #1.organizationName        = Second Organization Name (eg, company)
  252. #1.organizationName_default    = World Wide Web Pty Ltd
  253.  
  254. organizationalUnitName        = Organizational Unit Name (eg, section)
  255. #organizationalUnitName_default    =
  256.  
  257. commonName            = Common Name (eg, your name or your server\'s hostname)
  258. commonName_max            = 64
  259.  
  260. emailAddress            = Email Address
  261. emailAddress_max        = 40
  262.  
  263. # SET-ex3            = SET extension number 3
  264.  
  265. [ usr_cert ]
  266. # These extensions are added when 'ca' signs a request.
  267. # This goes against PKIX guidelines but some CAs do it and some software
  268. # requires this to avoid interpreting an end user certificate as a CA.
  269. #basicConstraints=CA:FALSE
  270.  
  271. # Here are some examples of the usage of nsCertType. If it is omitted
  272. # the certificate can be used for anything *except* object signing.
  273.  
  274. # This is OK for an SSL server.
  275. # nsCertType            = nsCertType
  276. # For normal client use this is typical
  277. # nsCertType = client, email
  278. nsCertType            = client
  279.  
  280. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  281.  
  282. # This will be displayed in Netscape's comment listbox.
  283. nsComment            = "OpenSSL Generated Certificate"
  284.  
  285. # PKIX recommendations harmless if included in all certificates.
  286. subjectKeyIdentifier=hash
  287. authorityKeyIdentifier=keyid,issuer:always
  288.  
  289. # This stuff is for subjectAltName and issuerAltname.
  290. # Import the email address.
  291. subjectAltName=email:copy
  292.  
  293. # Copy subject details
  294. issuerAltName=issuer:copy
  295.  
  296. #nsCaRevocationUrl        = http://www.domain.dom/ca-crl.pem
  297. #nsBaseUrl
  298. #nsRevocationUrl
  299. #nsRenewalUrl
  300. #nsCaPolicyUrl
  301. #nsSslServerName
  302.  
  303. [ v3_ca ]
  304. # PKIX recommendation.
  305. subjectKeyIdentifier=hash
  306. authorityKeyIdentifier=keyid:always,issuer:always
  307.  
  308. # This is what PKIX recommends but some broken software chokes on critical
  309. # extensions.
  310. basicConstraints = critical,CA:true
  311. # So we do this instead.
  312. #basicConstraints = CA:true
  313.  
  314. # Key usage: this is typical for a CA certificate. However since it will
  315. # prevent it being used as an test self-signed certificate it is best
  316. # left out by default.
  317. keyUsage = cRLSign, keyCertSign
  318. nsCertType = sslCA
  319. EOF
  320.  
  321. #
  322. echo 01 > $BASEDIR/serial
  323. touch $BASEDIR/index.txt
  324.  
  325. echo "**********"
  326. gettext "We are going to ask you some question for each client certificate. "; echo
  327. gettext "If some question has a default answer, you can force an empty answer by entering a single dot '.'"; echo
  328. echo "*********"
  329.  
  330.  
  331. I=1; ANOTHER=`gettext "y"`
  332.  
  333. while [ "$ANOTHER" != `gettext "n"` ]; do
  334.     PSEUDO=""
  335.     while [ -z "$PSEUDO" ]; do
  336.     eval_gettext "User \${Hash}\$I name \${Bo}e.g. Nessus username\${Bc}: "
  337.     read PSEUDO
  338.     CERTFILE="$BASEDIR/cert_$PSEUDO.pem"
  339.     KEYFILE="$BASEDIR/key_$PSEUDO.pem"
  340.     REQFILE="$BASEDIR/req_$PSEUDO.pem"
  341.     DNFILE="$USERSDIR/$PSEUDO/auth/dname" # Not wise if USERSDIR is not set
  342.     if [ -f "$CERTFILE" -o -f "$KEYFILE" -o -f "$DNFILE" ]; then
  343.         A=""
  344.         while [ -z "$A" ]; do
  345.         gettext "Certificate, key or Nessus DN file(s) already exist."; echo
  346.         gettext "Do you want to go on and overwrite it/them? (y/n) "
  347.         read A
  348.         if [ "$A" = `gettext "n"` ]; then PSEUDO=""; fi
  349.         done
  350.     fi
  351.     done
  352.  
  353.     eval_gettext "Client certificates life time in days [\$DFL_CERT_LIFETIME]: "
  354.     read x
  355.     CERT_LIFETIME=${x:-$DFL_CERT_LIFETIME}
  356.     X=$DFL_COUNTRY
  357.     eval_gettext "Country \${Bo}two letter code\${Bc} [\$X]: "; read x
  358.     COUNTRY=${x:-$DFL_COUNTRY}
  359.     X=$DFL_PROVINCE
  360.     eval_gettext "State or province name [\$X]: "; read x
  361.     PROVINCE=${x:-$DFL_PROVINCE}
  362.     X=$DFL_LOCATION
  363.     eval_gettext "Location \${Bo}e.g. town\${Bc} [\$X]: "; read x
  364.     LOCATION=${x:-$DFL_LOCATION}
  365.     X=$DFL_ORGANIZATION
  366.     eval_gettext "Organization [\$X]: "; read x
  367.     ORGANIZATION=${x:-$DFL_ORGANIZATION}
  368.     X=$DFL_ORGUNIT
  369.     eval_gettext "Organization unit [\$X]: "; read x
  370.     ORGUNIT=${x:-$DFL_ORGUNIT}
  371.     gettext "e-Mail []: "; read EMAIL
  372.  
  373.     # Client key
  374.     openssl genrsa -out $KEYFILE 1024
  375.  
  376.     # Client certificate "request"
  377. echo "${COUNTRY:-.}
  378. ${PROVINCE:-.}
  379. ${LOCATION:-.}
  380. ${ORGANIZATION:-.}
  381. ${ORGUNIT:-.}
  382. $PSEUDO
  383. ${EMAIL:-.}" | 
  384.     openssl req -config $BASEDIR/stdC.cnf -new -key $KEYFILE -out $REQFILE
  385.  
  386.     # Sign the client certificate
  387.     openssl ca -config $BASEDIR/stdC.cnf -name NessusCA -batch -days $CERT_LIFETIME -in $REQFILE -out $CERTFILE
  388.  
  389.     # Create export file for NessusWX
  390.     NWX_CERTFILE=$BASEDIR/cert_nessuswx_$PSEUDO.pem
  391.     cp $CERTFILE $NWX_CERTFILE
  392.     cat $KEYFILE >> $NWX_CERTFILE
  393.  
  394.     chmod a+r $CERTFILE
  395.     chmod a+r $NWX_CERTFILE
  396.  
  397.     if [ ! -z "$USERSDIR" ]; then
  398.  
  399.         # 
  400.         # create the auth dir, which contains the user rules, 
  401.         # password or cert, and plugin acl 
  402.     D="$USERSDIR/$PSEUDO/auth"
  403.     if [ ! -d "$D" ]; then
  404.         mkdir -p "$D"
  405.         chmod 700 "$D"
  406.     fi
  407.  
  408.         # 
  409.         # create the user auth/rules file 
  410.       # 
  411.       R="$USERSDIR/$PSEUDO/auth/rules" 
  412.       echo 
  413.       gettext "User rules"; echo 
  414.       echo "----------" 
  415.       eval_gettext "nessusd has a rules system which allows you to restrict the hosts that \$login has the right to test."; echo
  416.       gettext "For instance, you may want him to be able to scan his own host only."; echo
  417.       echo 
  418.       gettext "Please see the nessus-adduser(8) man page for the rules syntax."; echo
  419.       echo 
  420.       gettext "Enter the rules for this user, and hit ctrl-D once you are done:"; echo
  421.  
  422.       tmpAddUserFile=$TMPDIR/rules.$$
  423.  
  424.  
  425.       gettext "(the user can have an empty rules set)"; echo
  426.       cat > $tmpAddUserFile || { 
  427.               echo "Error - could not write $tmpAddUserFile" 
  428.               exit 1 
  429.       } 
  430.       cp $tmpAddUserFile "$USERSDIR/$PSEUDO/auth/rules" 
  431.  
  432.       rm $tmpAddUserFile 
  433.  
  434.       # 
  435.       # create the cert authentication file auth/dname 
  436.       # 
  437.     > $DNFILE
  438.     [ ! -z "$COUNTRY" -a "$COUNTRY" != "." ] &&
  439.         echo_no_nl "/C=$COUNTRY" >> $DNFILE
  440.     [ ! -z "$PROVINCE" -a "$PROVINCE" != "." ] &&
  441.         echo_no_nl "/ST=$PROVINCE" >> $DNFILE
  442.     [ ! -z "$LOCATION" -a "$LOCATION" != "." ] &&
  443.         echo_no_nl "/L=$LOCATION" >> $DNFILE
  444.     [ ! -z "$ORGANIZATION" -a "$ORGANIZATION" != "." ] && 
  445.         echo_no_nl "/O=$ORGANIZATION" >> $DNFILE
  446.     [ ! -z "$ORGUNIT" -a "$ORGUNIT" != "." ] && 
  447.         echo_no_nl "/OU=$ORGUNIT" >> $DNFILE
  448.     echo_no_nl "/CN=$PSEUDO" >> $DNFILE
  449.     [ ! -z "$EMAIL" ] && echo_no_nl "/emailAddress=$EMAIL" >> $DNFILE
  450.  
  451.       # 
  452.         # create the plugins dir, which contains the user plugins 
  453.         # 
  454.         E="$USERSDIR/$PSEUDO/plugins" 
  455.         if [ ! -d "$E" ]; then 
  456.             mkdir -p "$E" 
  457.             chmod 700 "$E" 
  458.         fi 
  459.         gettext "User added to Nessus."; echo
  460.     fi
  461.  
  462.     gettext "Another client certificate? (y/n) " 
  463.     read ANOTHER 
  464.     I=`expr $I + 1` 
  465. done
  466.  
  467. eval_gettext "Your client certificates are in \$BASEDIR."; echo
  468. gettext "You will have to copy them by hand."; echo
  469.  
  470.